package com.yzw.endecoderfixed;

import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.CharsetUtil;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Author: YangZhenWei
 * @PROJECT_NAME: nettyTeach
 * @DESCRIPTION: 通用handler，处理IO事件
 * @USER: root
 * @DATE: 2023/2/8 22:35
 **/
@ChannelHandler.Sharable
public class HandlerClientFixedLength extends SimpleChannelInboundHandler<String> {
    /**
     * 通道读写文件,处理读取信息
     *
     * @param channelHandlerContext 通道
     * @param info               指定String的消息
     * @throws Exception
     */
    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, String info) throws Exception {
        System.out.println("接收到的消息" + info.trim());

    }

    /**
     * 当链接到通道时进行的处理
     *
     * @param ctx 通道  处理定长
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        // 建立链接后channelActive方法只会被调用一次，这里的逻辑，建立链接后，字节序列被发送到服务器，编码格式是utf-8
        SimpleDateFormat dateFormat = new SimpleDateFormat("HH:MM:ss:SSS");
        String strDate = dateFormat.format(new Date());
        String strMsg="你好，服务器"+strDate;
        // 由于发送是定长祖父串，则需要改写字符串信息
        strMsg=CommonUtils.formatString(strMsg,CommonUtils.FIXEDLENGTHFRAME_LENGTH);
        System.out.println("已经链接上了服务器，现在发送一条消息"+strMsg);
        ctx.writeAndFlush(Unpooled.copiedBuffer(strMsg, CharsetUtil.UTF_8));
    }


    /**
     * 处理 io事件的异常
     *
     * @param ctx
     * @param cause
     * @throws Exception 抛出异常
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }

}
